package nb.diskfilesystem;

import javafx.animation.FadeTransition;
import javafx.animation.Interpolator;
import javafx.animation.ParallelTransition;
import javafx.animation.TranslateTransition;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.*;
import javafx.util.Duration;
import nb.diskfilesystem.controller.MainController;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class FileContextMenu {
    private TreeView<String> directoryTreeView;  // 添加字段声明
    private ContextMenu blockContextMenu = new ContextMenu();
    private ContextMenu fileContextMenu = new ContextMenu();
    private ScrollPane scrollPane;
    private TilePane fileArea;
    private int fileCounter = 1; // 文件计数器
    private int folderCounter = 1; // 文件夹计数器
    public FileContextMenu(TreeView<String> directoryTreeView) {
        this.directoryTreeView = directoryTreeView;
        init();
    }

    public void init() {
        scrollPane = (ScrollPane) MainController.rootNode.lookup("#scrollPane");
        fileArea = (TilePane) scrollPane.getContent();
        createBlockContextMenu();
        createFileContextMenu();
        addBlockContextMenuListener(); // 添加空白区域右键菜单监听器
    }

    // 创建空白右键菜单
    private void createBlockContextMenu() {
        MenuItem menuItem1 = new MenuItem("新建文件");
        Image icon1 = new Image(getClass().getResourceAsStream("/nb/diskfilesystem/img/菜单文件.png"));
        ImageView iconView1 = new ImageView(icon1);
        iconView1.setFitWidth(20);  // 设置图标宽度
        iconView1.setFitHeight(20); // 设置图标高度
        iconView1.setTranslateX(-2.7); //
        menuItem1.setGraphic(iconView1);

        MenuItem menuItem2 = new MenuItem("新建文件夹");
        Image icon2 = new Image(getClass().getResourceAsStream("/nb/diskfilesystem/img/菜单文件夹.png"));
        ImageView iconView2 = new ImageView(icon2);
        iconView2.setFitWidth(17);  // 设置图标宽度
        iconView2.setFitHeight(17); // 设置图标高度
        menuItem2.setGraphic(iconView2);

        menuItem1.setOnAction(
                event -> createFile()

        );
        menuItem2.setOnAction(event -> createFolder());
        blockContextMenu.getItems().addAll(menuItem1, menuItem2);
    }

    // 创建文件右键菜单
    private void createFileContextMenu() {
        MenuItem menuItem1 = new MenuItem("打开");
        Image icon1 = new Image(getClass().getResourceAsStream("/nb/diskfilesystem/img/打开.png"));
        ImageView iconView1 = new ImageView(icon1);
        iconView1.setFitWidth(20);
        iconView1.setFitHeight(20);
        iconView1.setTranslateX(-2.7);
        menuItem1.setGraphic(iconView1);

        // 添加打开文件的事件处理
        menuItem1.setOnAction(event -> {
            BorderPane selectedPane = getSelectedBorderPane();
            if (selectedPane != null) {
                Label nameLabel = (Label) selectedPane.getBottom();
                String fileName = nameLabel.getText();

                // 获取当前节点
                Directory_Node currentNode = DirectoryTreeBuilder.getNodeByName(ViewHandler.curentFilePath, fileName);
                if (currentNode != null) {
                    try {
                        if (currentNode.getAttribute() == 8) {
                            // 如果是文件夹，不执行打开操作
                            System.out.println("这是一个文件夹");
                        } else {
                            // 如果是文件，调用 ViewHandler 的打开文件方法
                            ViewHandler.openDirectroy_Node(currentNode);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        MenuItem menuItem2 = new MenuItem("删除");
        Image icon2 = new Image(getClass().getResourceAsStream("/nb/diskfilesystem/img/删除.png"));
        ImageView iconView2 = new ImageView(icon2);
        iconView2.setFitWidth(20);  // 设置图标宽度
        iconView2.setFitHeight(20); // 设置图标高度
        iconView2.setTranslateX(-3);
        menuItem2.setGraphic(iconView2);

        menuItem2.setOnAction(event -> {
            // 获取当前选中的文件/文件夹
            BorderPane selectedPane = getSelectedBorderPane();
            if (selectedPane != null) {
                Label nameLabel = (Label) selectedPane.getBottom();
                String fileName = nameLabel.getText();

                // 获取当前节点
                Directory_Node currentNode = DirectoryTreeBuilder.getNodeByName(ViewHandler.curentFilePath, fileName);
                if (currentNode != null) {
                    showDeleteConfirmDialog(currentNode, selectedPane);
                }
            }
        });



        MenuItem menuItem3 = new MenuItem("重命名");
        Image icon3 = new Image(getClass().getResourceAsStream("/nb/diskfilesystem/img/重命名.png"));
        ImageView iconView3 = new ImageView(icon3);
        iconView3.setFitWidth(18.5);  // 设置图标宽度
        iconView3.setFitHeight(18.5); // 设置图标高度
        iconView3.setTranslateX(-2.7);
        menuItem3.setGraphic(iconView3);

        menuItem3.setOnAction(event -> {
            // 获取当前选中的文件/文件夹
            BorderPane selectedPane = getSelectedBorderPane();
            if (selectedPane != null) {
                Label nameLabel = (Label) selectedPane.getBottom();
                String oldName = nameLabel.getText();

                // 获取当前节点
                Directory_Node currentNode = DirectoryTreeBuilder.getNodeByName(ViewHandler.curentFilePath, oldName);
                if (currentNode != null) {
                    showRenameDialog(currentNode, selectedPane);
                }
            }
        });



        MenuItem menuItem4 = new MenuItem("属性");
        Image icon4 = new Image(getClass().getResourceAsStream("/nb/diskfilesystem/img/属性.png"));
        ImageView iconView4 = new ImageView(icon4);
        iconView4.setFitWidth(20);  // 设置图标宽度
        iconView4.setFitHeight(20); // 设置图标高度
        iconView4.setTranslateX(-3);
        menuItem4.setGraphic(iconView4);

        menuItem4.setOnAction(event -> {
            // 获取当前选中的文件/文件夹
            BorderPane selectedPane = getSelectedBorderPane();
            if (selectedPane != null) {
                Label nameLabel = (Label) selectedPane.getBottom();
                String fileName = nameLabel.getText();

                // 获取当前节点
                Directory_Node currentNode = DirectoryTreeBuilder.getNodeByName(ViewHandler.curentFilePath, fileName);
                if (currentNode != null) {
                    showFileProperties(currentNode);
                }
            }
        });

        fileContextMenu.getItems().addAll(menuItem1, menuItem2, menuItem3, menuItem4);
    }

    // 创建文件
    private void createFile() {
        String currentPath = ViewHandler.filePath;
        System.out.println("当前路径: " + currentPath);

        // 找到父节点
        Directory_Node parentNode = DirectoryTreeBuilder.getNodeInDirectory(ViewHandler.curentFilePath);
        if (parentNode == null) {
            System.out.println("父节点不存在，无法创建文件!");
            return;
        }

        System.out.println("父节点目录起始块: " + parentNode.getStartBlock() + " 父节点属性: " + parentNode.getAttribute());

        // 检查父节点是否为目录
        if (parentNode.getAttribute() != 8) {
            System.out.println("父节点不是目录，无法创建文件!");
            return;
        }

        // 检查父节点下的目录项是否有空闲位置
        int freeDirIndex = FATManage.findFreeDirectoryEntry(parentNode);
        if (freeDirIndex == -1) {
            System.out.println("父节点目录已满，无法创建文件!");
            return;
        }

        // 得出分配空闲的盘块
        int freeBlock = FATManage.searchFreeByte();
        if (freeBlock == -1) {
            System.out.println("磁盘空间不足，无法创建文件!");
            return;
        }

        // 创建文件，并添加到滚动面板中，文件名称默认为"新建文件"+序号，例如：新建文件1.txt，创建文件后同时增加Directory_Node对象
        String fileName = "f" + fileCounter++;
        BorderPane borderPane = new BorderPane();
        borderPane.getStylesheets().add(getClass().getResource("/nb/diskfilesystem/css/border.css").toExternalForm());
        borderPane.getStyleClass().add("borderpane");
        borderPane.setPrefSize(100, 100);

        setBorderhandler(borderPane);
        // 修改这里：使用 ViewHandler 的 setBorderhandler 方法
        ViewHandler viewHandler = new ViewHandler(directoryTreeView, fileArea, this);
        viewHandler.setBorderhandler(borderPane);

        Pane centerPane = new Pane();
        centerPane.getStyleClass().add("pane");
        centerPane.getStylesheets().add(getClass().getResource("/nb/diskfilesystem/css/file.css").toExternalForm());
        borderPane.setCenter(centerPane);
        Label label = new Label(fileName);
        borderPane.setBottom(label);
        BorderPane.setAlignment(label, Pos.CENTER);
        fileArea.getChildren().add(borderPane);

        // 第一步更新FAT表，将分配的盘块标记为已使用
        FATManage.setByteUsed(freeBlock);
        // 创建Directory_Node对象
        Directory_Node newFile = new Directory_Node();

        newFile.setFile_Name(fileName.getBytes());   //传过去一个只有2字节的byte数组替换掉了node里面的3字节数组
        newFile.setBack_name("tx".getBytes());      //这里会不会出错，注意文件后缀名只能保存两个字节
        newFile.setAttribute((byte) 4);             // 文件属性为4，表示普通文件
        newFile.setStartBlock((byte) freeBlock);
        newFile.setLength((byte) 1);                // 件长度为1个盘块

        // 将新文件添加到父节点的子节点列表中
        parentNode.getChildrens().add(newFile);
        newFile.setParent(parentNode);

        // 写入新文件的目录项
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 0, newFile.getFile_Name()[0]);
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 1, newFile.getFile_Name()[1]);
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 2, newFile.getFile_Name()[2]);   //这里为什么会出错，没有初始化吗
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 3, newFile.getBack_name()[0]);
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 4, newFile.getBack_name()[1]);
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 5, newFile.getAttribute());
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 6, newFile.getStartBlock());
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 7, newFile.getLength());

        // 更新目录树
        updateDirectoryTreeView();

        // 更新磁盘块视图
        MainController mainController = (MainController) MainController.rootNode.getScene().getUserData();
        if (mainController != null) {
            mainController.updateBlockView();
        }

    }

    // 添加新方法用于更新目录树
    private void updateDirectoryTreeView() {
        // 保存当前路径
        String currentPath = ViewHandler.curentFilePath;

        // 重新构建目录树
        TreeItem<String> newRoot = DirectoryTreeBuilder.buildDirectoryTree();

        // 在JavaFX应用程序线程中更新UI
        javafx.application.Platform.runLater(() -> {
            directoryTreeView.setRoot(newRoot);
            // 展开到当前路径
            expandToCurrentPath(newRoot, currentPath);
        });
    }

    // 修改展开到指定路径的方法
    private void expandToCurrentPath(TreeItem<String> root, String path) {
        if (path == null || path.isEmpty()) {
            return;
        }

        String[] pathParts = path.split("\\\\");
        TreeItem<String> current = root;

        // 遍历路径的每一部分
        for (String part : pathParts) {
            if (part.equals("C盘") || part.isEmpty()) {
                continue;
            }

            // 在当前节点的子节点中查找匹配的节点
            for (TreeItem<String> child : current.getChildren()) {
                if (child.getValue().equals(part)) {
                    child.setExpanded(true);  // 只展开路径上的节点
                    current = child;
                    break;
                }
            }
        }
    }

    // 创建文件夹
    private void createFolder() {
        //��建文件夹逻辑
        String currentPath = ViewHandler.filePath; // 获取当前路径
        System.out.println(currentPath);
        // 找到父节点
        Directory_Node parentNode =DirectoryTreeBuilder.getNodeInDirectory(ViewHandler.curentFilePath);
        System.out.println("父节点目录起始块"+parentNode.getStartBlock()+"父节点属性"+parentNode.getAttribute());

        System.out.println(parentNode);
        if (parentNode == null) {
            System.out.println("父节点不存在，无法创建文件!");
            return;
        }

        // 检查父节点下的目录项是否有空闲位置
        int freeDirIndex = FATManage.findFreeDirectoryEntry(parentNode);   //计算出父节点下哪一列是空闲项
        if (freeDirIndex == -1) {
            System.out.println("父节点目录已满，无法创建文件!");
            return;
        }
        // 得出分配空闲的盘块
        int freeBlock = FATManage.searchFreeByte();
        if (freeBlock == -1) {
            System.out.println("磁盘空间不足，无法创建文件!");
            return;
        }

        // 允许创文件夹，并添加到滚动面板中，文件名称默认为"新建文件夹"+序号，例如：新建文件夹1，创建文件后同时增加Directory_Node对象
        BorderPane borderPane = new BorderPane();
        borderPane.getStylesheets().add(getClass().getResource("/nb/diskfilesystem/css/border.css").toExternalForm());
        borderPane.getStyleClass().add("borderpane");
        borderPane.setPrefSize(100, 100);

        setBorderhandler(borderPane);
        // 修改这里：使用 ViewHandler 的 setBorderhandler 方法
        ViewHandler viewHandler = new ViewHandler(directoryTreeView, fileArea, this);
        viewHandler.setBorderhandler(borderPane);

        Pane centerPane = new Pane();
        centerPane.getStyleClass().add("pane");
        centerPane.getStylesheets().add(getClass().getResource("/nb/diskfilesystem/css/folder.css").toExternalForm());
        borderPane.setCenter(centerPane);

        String dirName="j"+folderCounter++;
        Label label = new Label(dirName);
        borderPane.setBottom(label);
        BorderPane.setAlignment(label, Pos.CENTER);
        fileArea.getChildren().add(borderPane);
        //新建文件夹后，调用diskManager中写入文件的方法

        // 第一步更新FAT表，将分配的盘块标记为已使用
        FATManage.setByteUsed(freeBlock);
        // 创建Directory_Node对象
        Directory_Node newFile = new Directory_Node();

        newFile.setFile_Name(dirName.getBytes());   //传过去一个只有2字节的byte数组替换掉了node里面的3字节数组
        newFile.setBack_name(" ".getBytes());      //文件夹这两个字节是空格
        newFile.setAttribute((byte) 8);             // 文件属性为4，表示普通文件
        newFile.setStartBlock((byte) freeBlock);
        newFile.setLength((byte) 0);                // 文件长度为1个盘块

        // 将新文件添加到父节点的子节点列表中
        parentNode.getChildrens().add(newFile);
        newFile.setParent(parentNode);

        // 写入新文件的目录项
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 0, newFile.getFile_Name()[0]);
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 1, newFile.getFile_Name()[1]);
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 2, newFile.getFile_Name()[2]);   //这里为什么会出错，没有初始化吗
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 3, newFile.getBack_name()[0]);
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 4, newFile.getBack_name()[1]);
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 5, newFile.getAttribute());
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 6, newFile.getStartBlock());
        DiskManage.writeOnlyByte(parentNode.getStartBlock(), freeDirIndex, 7, newFile.getLength());
        for (int i = 0; i < 8; i++) {
            DiskManage.writeOnlyByte(newFile.getStartBlock(), i, 0, (byte) '$');//$表示目录为空·
        }

        // 更新目录树
        updateDirectoryTreeView();

        // 更新磁盘块视图
        MainController mainController = (MainController) MainController.rootNode.getScene().getUserData();
        if (mainController != null) {
            mainController.updateBlockView();
        }
    }


    //设置Border区域的监听事情
    public void setBorderhandler(BorderPane borderPane){
        borderPane.setOnMouseClicked(event -> {
            // 移除其他FileItem的选中样式
            fileArea.getChildren().forEach(node -> {
                if (node instanceof BorderPane && node != borderPane) {
                    node.getStyleClass().remove("borderpane-selected");
                }
            });
            this.getBlockContextMenu().hide(); // 隐藏空白区域右键菜单
            // 添加选中样式
            if (!borderPane.getStyleClass().contains("borderpane-selected")) {
                borderPane.getStyleClass().add("borderpane-selected");
            }
            // 如果是右键点击，显示文件右键菜单
            if (event.getButton() == MouseButton.SECONDARY) {
                animateContextMenu(true, this.getFileContextMenu());
                this.getFileContextMenu().show(borderPane, event.getScreenX(), event.getScreenY());
            }
            event.consume();
        });
    }

    // 添加空白区域右键菜单监听器
    private void addBlockContextMenuListener() {
        // 为滚动面板设置鼠标点击事件监听器
        scrollPane.setOnMouseClicked(event -> {
            // 如果是右键点击
            if (event.getButton() == MouseButton.SECONDARY) {
                // 移除所有文件项的选中样式
                fileArea.getChildren().forEach(node -> {
                    if (node instanceof BorderPane) {
                        node.getStyleClass().remove("borderpane-selected");
                    }
                });
                // 显示空白区域右键菜单，并添加动画效果
                animateContextMenu(true, blockContextMenu);
                blockContextMenu.show(scrollPane, event.getScreenX(), event.getScreenY());
            } else if (event.getButton() == MouseButton.PRIMARY) { // 如果是左键点击
                // 移除所有文件项的��中样式
                fileArea.getChildren().forEach(node -> {
                    if (node instanceof BorderPane) {
                        node.getStyleClass().remove("borderpane-selected");
                    }
                });
                // 隐藏空区域右键菜单
                blockContextMenu.hide();
            }
        });
    }

    // 动画效果
    public static void animateContextMenu(boolean show, ContextMenu contextMenu) {
        contextMenu.getScene().getRoot().applyCss();
        contextMenu.getScene().getRoot().layout();
        TranslateTransition translateTransition = new TranslateTransition(Duration.millis(185), contextMenu.getScene().getRoot());
        FadeTransition fadeTransition = new FadeTransition(Duration.millis(185), contextMenu.getScene().getRoot());
        translateTransition.setInterpolator(Interpolator.EASE_BOTH);
        fadeTransition.setInterpolator(Interpolator.EASE_BOTH);
        if (show) {
            translateTransition.setFromY(-contextMenu.getHeight());
            translateTransition.setToY(0);
            fadeTransition.setFromValue(0);
            fadeTransition.setToValue(1);
        } else {
            translateTransition.setFromY(0);
            translateTransition.setToY(-contextMenu.getHeight());
            fadeTransition.setFromValue(1);
            fadeTransition.setToValue(0);
        }
        ParallelTransition parallelTransition = new ParallelTransition(translateTransition, fadeTransition);
        parallelTransition.play();
    }

    //获取文件右键菜单
    public ContextMenu getFileContextMenu() {
        return fileContextMenu;
    }
    //获取空白处右键菜单
    public ContextMenu getBlockContextMenu() {
        return blockContextMenu;
    }


    private BorderPane getSelectedBorderPane() {
        TilePane fileArea = (TilePane) scrollPane.getContent();
        for (javafx.scene.Node node : fileArea.getChildren()) {
            if (node instanceof BorderPane &&
                    node.getStyleClass().contains("borderpane-selected")) {
                return (BorderPane) node;
            }
        }
        return null;
    }

    private void showRenameDialog(Directory_Node node, BorderPane borderPane) {
        TextInputDialog dialog = new TextInputDialog(
                new String(node.getFile_Name(), 0, 3).trim());
        dialog.setTitle("重命名");
        dialog.setHeaderText(null);
        dialog.setContentText(null);

        // 获取对话框的DialogPane并设置样式
        DialogPane dialogPane = dialog.getDialogPane();
        dialogPane.getStylesheets().add(
                getClass().getResource("/nb/diskfilesystem/css/dialog.css").toExternalForm()
        );
        dialogPane.getStyleClass().add("custom-dialog");

        // 设置对话框的首选宽度
        dialogPane.setPrefWidth(350);

        // 创建主容器
        VBox mainContainer = new VBox(15);
        mainContainer.getStyleClass().add("main-container");

        // 创建标题
        Label titleLabel = new Label("重命名");
        titleLabel.getStyleClass().add("dialog-title");

        // 创建说明文本
        Label promptLabel = new Label("请输入新名称:");
        promptLabel.getStyleClass().add("prompt-label");

        // 获取并设置输入框样式
        TextField inputField = (TextField) dialogPane.lookupAll(".text-field").iterator().next();
        inputField.getStyleClass().add("custom-input");

        // 组装界面
        mainContainer.getChildren().addAll(titleLabel, promptLabel, inputField);
        dialogPane.setContent(mainContainer);

        // 自定义按钮样式
        Button okButton = (Button) dialogPane.lookupButton(ButtonType.OK);
        Button cancelButton = (Button) dialogPane.lookupButton(ButtonType.CANCEL);
        okButton.setText("确定");
        cancelButton.setText("取消");
        okButton.getStyleClass().add("primary-button");
        cancelButton.getStyleClass().add("secondary-button");

        // 移除默认图标
        dialog.setGraphic(null);

        dialog.showAndWait().ifPresent(newName -> {
            if (!newName.isEmpty() && newName.length() <= 3) {
                // 更新节点称
                byte[] newNameBytes = new byte[3];
                byte[] nameBytes = newName.getBytes();
                System.arraycopy(nameBytes, 0, newNameBytes, 0,
                        Math.min(nameBytes.length, 3));

                // 更新目录项
                updateDirectoryEntry(node, newNameBytes);

                // 更新UI显示
                Label nameLabel = (Label) borderPane.getBottom();
                nameLabel.setText(newName);

                // 更新树视图
                updateTreeView(node, newName);

                // 更新FAT表显示
                FATManage.updateFATTable();
            } else {
                showErrorDialog("错误", "名称不能为空且长度不能超过3个字符!");
            }
        });
    }

    private void updateDirectoryEntry(Directory_Node node, byte[] newName) {
        // 获取父节点的起始块号
        Directory_Node parent = node.getParent();
        int parentBlock = parent.getStartBlock();

        // 在父目录块中查找并更新目录项
        byte[] searchArray = node.toByteArray();
        byte[] fullArray = DiskManage.readBlock(parentBlock);

        for (int i = 0; i < 64; i += 8) {
            byte[] subArray = new byte[8];
            System.arraycopy(fullArray, i, subArray, 0, 8);
            if (java.util.Arrays.equals(subArray, searchArray)) {
                // 更新文件名
                for (int j = 0; j < 3; j++) {
                    DiskManage.writeOnlyByte(parentBlock, i/8, j, newName[j]);
                }
                break;
            }
        }

        // 更新节点的文件名
        node.setFile_Name(newName);
    }

    private void updateTreeView(Directory_Node node, String newName) {
        if (node.getAttribute() == 8) { // 如果是文件夹才需要更新树视图
            TreeItem<String> root = directoryTreeView.getRoot();
            updateTreeItem(root, node.getPath(), newName);
        }
    }

    private void updateTreeItem(TreeItem<String> item, String path, String newName) {
        if (item == null) return;

        if (item.getValue().equals(path)) {
            item.setValue(newName);
            return;
        }

        for (TreeItem<String> child : item.getChildren()) {
            updateTreeItem(child, path, newName);
        }
    }

    // 修改 deleteFileOrFolder 方法
    private void deleteFileOrFolder(Directory_Node node, BorderPane borderPane) {
        // 如���是文件夹，检查是否为空
        if (node.getAttribute() == 8) {
            if (!isFolderEmpty(node)) {
                showErrorDialog("删除失败", "文件夹不为空，无法删除！");
                return;
            }
            deleteFolder(node);
        } else {
            // 如果是文件，直接删除
            deleteFile(node);
        }

        // 从父节点的子节点列表中移除
        Directory_Node parent = node.getParent();
        if (parent != null) {
            parent.getChildrens().remove(node);

            // 在父目录块中找到并清除该目录项
            clearDirectoryEntry(parent, node);
        }

        // 从界面上移除
        fileArea.getChildren().remove(borderPane);

        // 更新目录树
        updateDirectoryTreeView();

        // 更新FAT表显示
        FATManage.updateFATTable();

        // 更新磁盘块视图
        MainController mainController = (MainController) MainController.rootNode.getScene().getUserData();
        if (mainController != null) {
            mainController.updateBlockView();
        }


    }

    // 添加检查文件夹否为空的方法
    private boolean isFolderEmpty(Directory_Node folder) {
        if (folder.getChildrens() == null) {
            return true;
        }

        // 检查目录块中是否有有效的目录项
        byte[] blockContent = DiskManage.readBlock(folder.getStartBlock());
        for (int i = 0; i < 64; i += 8) {
            // 检查第一个字节是否为 '$'（表示空目录项）
            if (blockContent[i] != '$') {
                return false;
            }
        }
        return true;
    }

    // 修改 deleteFolder 方法，移除递归删除的逻辑
    private void deleteFolder(Directory_Node folder) {
        // 只释放文件夹自身占用的块
        FATManage.setByteFree(folder.getStartBlock());
    }

    // 删除文件
    private void deleteFile(Directory_Node file) {
        // 释放文件占用的所有块
        FATManage.freeFileContent(file.getStartBlock());
    }

    // 清除目录项
    private void clearDirectoryEntry(Directory_Node parent, Directory_Node node) {
        byte[] searchArray = node.toByteArray();
        byte[] fullArray = DiskManage.readBlock(parent.getStartBlock());

        for (int i = 0; i < 64; i += 8) {
            byte[] subArray = new byte[8];
            System.arraycopy(fullArray, i, subArray, 0, 8);
            if (java.util.Arrays.equals(subArray, searchArray)) {
                // 找到匹配的目录项，将其标记为删除（使用 '$' 标记）
                DiskManage.writeOnlyByte(parent.getStartBlock(), i/8, 0, (byte)'$');
                break;
            }
        }
    }

    // 添加显示属性对话框的方法
    private void showFileProperties(Directory_Node node) {
        Alert alert = new Alert(Alert.AlertType.NONE);  // 改为NONE类型移除图标
        alert.setTitle("文件属性");
        alert.setHeaderText(null);

        // 获取对话框的DialogPane并设置样式
        DialogPane dialogPane = alert.getDialogPane();
        dialogPane.getStylesheets().add(
                getClass().getResource("/nb/diskfilesystem/css/properties.css").toExternalForm()
        );
        dialogPane.getStyleClass().add("property-dialog");

        // 设置对话框的首选宽度
        dialogPane.setPrefWidth(400);

        // 创建主容器
        VBox mainContainer = new VBox(15);
        mainContainer.getStyleClass().add("main-container");
        mainContainer.setPrefWidth(380);

        // 创建标题区域
        HBox titleBox = new HBox();
        titleBox.getStyleClass().add("title-box");

        Label titleLabel = new Label(new String(node.getFile_Name()).trim());
        titleLabel.getStyleClass().add("title-label");
        titleBox.getChildren().add(titleLabel);

        // 创建属性内容容器
        VBox contentBox = new VBox(10);
        contentBox.getStyleClass().add("content-box");
        contentBox.setPrefWidth(360);

        // 获取文件信息
        String type = (node.getAttribute() == 8) ? "文件夹" : "文件";
        String location = ViewHandler.filePath;
        String size = "";
        if (node.getAttribute() != 8) {
            int blockCount = calculateBlockCount(node);
            size = blockCount * 64 + " 字节";
        }
        String startBlock = String.valueOf(node.getStartBlock());

        // 添加属性项
        addPropertyItem(contentBox, "类型", type);
        addPropertyItem(contentBox, "位置", location);
        if (!size.isEmpty()) {
            addPropertyItem(contentBox, "大小", size);
        }
        addPropertyItem(contentBox, "起始块号", startBlock);

        // 组装所有元素
        mainContainer.getChildren().addAll(titleBox, contentBox);
        dialogPane.setContent(mainContainer);

        // 添加确定按钮
        alert.getButtonTypes().add(ButtonType.OK);

        // 自定义确定按钮
        Button okButton = (Button) dialogPane.lookupButton(ButtonType.OK);
        okButton.setText("确定");
        okButton.getStyleClass().add("ok-button");

        alert.showAndWait();
    }

    // 修改属性项的添加方法
    private void addPropertyItem(VBox container, String label, String value) {
        GridPane item = new GridPane();
        item.getStyleClass().add("property-item");
        item.setHgap(15);

        Label labelNode = new Label(label + ":");
        labelNode.getStyleClass().add("property-label");
        GridPane.setConstraints(labelNode, 0, 0);

        Label valueNode = new Label(value);
        valueNode.getStyleClass().add("property-value");
        valueNode.setWrapText(true);
        GridPane.setConstraints(valueNode, 1, 0);

        // 设置列的大小约束
        ColumnConstraints labelColumn = new ColumnConstraints();
        labelColumn.setPrefWidth(80);
        labelColumn.setMinWidth(80);

        ColumnConstraints valueColumn = new ColumnConstraints();
        valueColumn.setHgrow(Priority.ALWAYS);

        item.getColumnConstraints().addAll(labelColumn, valueColumn);
        item.getChildren().addAll(labelNode, valueNode);
        container.getChildren().add(item);
    }

    // 计算文件占用的块数
    private int calculateBlockCount(Directory_Node node) {
        int blockCount = 0;
        int currentBlock = node.getStartBlock();
        while (currentBlock != -1 && currentBlock != 255) {
            blockCount++;
            if (currentBlock >= 64) {
                currentBlock = DiskManage.readOnlyByte(1, (currentBlock-64)/8, (currentBlock-64)%8);
            } else {
                currentBlock = DiskManage.readOnlyByte(0, currentBlock/8, currentBlock%8);
            }
        }
        return blockCount;
    }

    // 修改删除确认对话框
    private void showDeleteConfirmDialog(Directory_Node node, BorderPane borderPane) {
        Alert alert = new Alert(Alert.AlertType.NONE);
        alert.setTitle("删除确认");
        alert.setHeaderText(null);
        alert.setContentText(null);

        // 获取对话框的DialogPane并设置样式
        DialogPane dialogPane = alert.getDialogPane();
        dialogPane.getStylesheets().add(
                getClass().getResource("/nb/diskfilesystem/css/dialog.css").toExternalForm()
        );
        dialogPane.getStyleClass().add("custom-dialog");

        // 设置对话框的首选宽度
        dialogPane.setPrefWidth(350);

        // 创建主容器
        VBox mainContainer = new VBox(15);
        mainContainer.getStyleClass().add("main-container");

        // 创建标题
        Label titleLabel = new Label("确认删除");
        titleLabel.getStyleClass().add("dialog-title");

        // 创建提示信息
        Label messageLabel = new Label("是否确定要删除 \"" +
                new String(node.getFile_Name()).trim() + "\" ?");
        messageLabel.getStyleClass().add("message-label");
        messageLabel.setWrapText(true);

        // 组装界面
        mainContainer.getChildren().addAll(titleLabel, messageLabel);
        dialogPane.setContent(mainContainer);

        // 设置按钮
        alert.getButtonTypes().addAll(ButtonType.YES, ButtonType.NO);
        Button yesButton = (Button) dialogPane.lookupButton(ButtonType.YES);
        Button noButton = (Button) dialogPane.lookupButton(ButtonType.NO);
        yesButton.setText("删除");
        noButton.setText("取消");
        yesButton.getStyleClass().add("delete-button");
        noButton.getStyleClass().add("secondary-button");

        alert.showAndWait().ifPresent(type -> {
            if (type == ButtonType.YES) {
                deleteFileOrFolder(node, borderPane);
            }
        });
    }

    // 添加错误提示对话框方法
    private void showErrorDialog(String title, String message) {
        Alert alert = new Alert(Alert.AlertType.NONE);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(null);

        DialogPane dialogPane = alert.getDialogPane();
        dialogPane.getStylesheets().add(
                getClass().getResource("/nb/diskfilesystem/css/dialog.css").toExternalForm()
        );
        dialogPane.getStyleClass().add("custom-dialog");
        dialogPane.setPrefWidth(350);

        VBox mainContainer = new VBox(15);
        mainContainer.getStyleClass().add("main-container");

        Label titleLabel = new Label(title);
        titleLabel.getStyleClass().add("dialog-title");

        Label messageLabel = new Label(message);
        messageLabel.getStyleClass().add("message-label");
        messageLabel.setWrapText(true);

        mainContainer.getChildren().addAll(titleLabel, messageLabel);
        dialogPane.setContent(mainContainer);

        alert.getButtonTypes().add(ButtonType.OK);
        Button okButton = (Button) dialogPane.lookupButton(ButtonType.OK);
        okButton.setText("确定");
        okButton.getStyleClass().add("primary-button");

        alert.showAndWait();
    }
}


